/**
 * 保留 children 的分组函数
 * @param arr 要分组的数组
 * @param getGroupKey 获取分组键的函数 (item, index, array) => key
 * @param childrenKey 子节点属性名（默认 'children'）
 * @returns Map 结构的分组结果（保留原始 children 结构）
 */
export function arrayGroupBy<T extends Record<string, any>>(
  arr: T[],
  getGroupKey: (item: T, index: number, array: T[]) => any,
  childrenKey: string = 'children',
): Map<any, T[]> {
  const result = new Map();

  // 递归处理函数
  const processItem = (item: T, parentGroup?: any) => {
    const currentKey = getGroupKey(item, -1, arr);
    const groupKey = parentGroup === undefined ? currentKey : parentGroup;

    // 初始化分组
    if (!result.has(groupKey)) {
      result.set(groupKey, []);
    }

    // 创建分组项的副本（保留原始引用）
    const groupedItem = { ...item };
    result.get(groupKey).push(groupedItem);

    // 递归处理子项（保持原有 children 结构）
    if (item[childrenKey]?.length) {
      groupedItem[childrenKey as keyof T] = item[childrenKey].map(
        (child: T) => {
          return processItem(child, currentKey); // 子项继承父项的分组键
        },
      );
    }

    return groupedItem;
  };

  // 处理顶层数组
  arr.forEach((item) => {
    processItem(item);
  });

  return result;
}
